perm filename MONMON[S,SYS]3 blob
sn#026132 filedate 1973-02-28 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00025 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00004 00002 TITLE MONMON - NEW MONITOR MONITOR.
00008 00003 SUBTTL STORAGE OF SORTS
00014 00004 SUBTTL ERROR MESSAGES.
00015 00005 SUBTTL HERE WE LOCATE THE SYSTEM SYMBOL TABLE
00017 00006 SUBTTL THERE ARE NO SYMBOLS IN SYSTEM CORE - READ SWAPPING DISK.
00020 00007 SUBTTL SYMBOL TABLE STUFF
00024 00008 SUBTTL SEGMENT MANAGER
00026 00009 SUBTTL UNDEF - ERROR MESSAGE FOR UNDEFINED SYMBOLS.
00027 00010 SUBTTL BEGIN HERE
00031 00011 SUBTTL MAIN COMMAND SCANNER.
00036 00012 SUBTTL GETSIX
00038 00013 SUBTTL PUT UP A TITLE LINE.
00041 00014 SUBTTL SWPINI & SPWMOD SPACEWAR JOB
00045 00015 SUBTTL PROCESS "CLOCK" REQUESTS
00046 00016 SUBTTL DCHR CHARACTER-BY-CHARACTER DISPLAY
00047 00017 SUBTTL HMSTIME HOURS-MINUTES-SECONDS TIME.
00049 00018 SUBTTL DDATE
00050 00019 SUBTTL DPYTAB
00054 00020 SUBTTL MAP DISPLAY A CORE MAP
00058 00021 SUBTTL THE LITTLE MAN INSIDE?
00061 00022 DEFINE FOO(X,Y,III)
00066 00023 SUBTTL MDRAW DRAW THE MAP
00073 00024 SUBTTL DSIXB SIXBIT OUTPUT ROUTINE
00076 00025 END BEGIN
00077 ENDMK
⊗;
TITLE MONMON - NEW MONITOR MONITOR.
SUBTTL REG 2 MAY 72.
; DEFINITIONS
A←1
B←2
C←3
D←4
W←5
X←6
Y←7
Z←10
K←11
L←12
M←13
N←14
R←15
SPDL←16 ;SPECIAL PDL
P←17 ;NORMAL PDL
; OPDEFS
OPDEF UPGIOT [703B8]
OPDEF RESET [CALLI]
OPDEF CORE [CALLI 11]
OPDEF EXIT [CALLI 12]
OPDEF DATE [CALLI 14]
OPDEF TIMER [CALLI 22]
OPDEF PEEK [CALLI 33]
OPDEF SLEEP [CALLI 31]
OPDEF REMAP [CALLI 37]
OPDEF SETPR2 [CALLI 400052]
OPDEF CORE2 [CALLI 400015]
OPDEF DETSEG [CALLI 400017]
OPDEF LINKUP [CALLI 400023]
OPDEF SPCWGO [CALLI 400003]
OPDEF SSW [043000,,636367] ;STOP SPACEWAR.
OPDEF DISMIS [CALLI 400024] ;UUO TO DISMISS SPACEWAR.
OPDEF DPYCLR [701B8] ;NORMALIZE DPY
OPDEF PPIOT [702B8] ;PAGE PRINTER OPERATIONS
OPDEF PPSEL [PPIOT] ;SELECT PIECE OF PAPER.
OPDEF PPACT [PPIOT 1,] ;EA = BIT MAP PP0=18, PP1=19, ENABLE PP
OPDEF DPYPOS [PPIOT 2,] ;SET FIRST LINE Y POSITION TO EA +/- 1000
OPDEF DPYSIZ [PPIOT 3,] ;X*1000+Y
OPDEF PGIOT [715B8] ;PEICE OF GLASS
VBRT←←4000 ;LVW BRIGHTNESS FIELD
VSIZ←←1000 ;LVW SIZE FIELD
VABS←←100 ;LVW ABSOLUTE FIELD
VENDP←←20 ;LVW ENDPOINT FIELD
VINVIS←←40 ;LVW INVISIBLE FIELD
DEFINE LVW(X,Y,TYPE,MODE,BRT,SIZ)<
IFIDN <MODE><a>,<MD←←1;>MD←←0
IFIDN <TYPE><i>,<TT←←2;>TT←←0
IFIDN <BRT><>,<BQ←←0;>BQ←←BRT
IFIDN <SIZ><>,<SQ←←0;>SQ←←SIZ
BYTE(11)<X>,<Y>(3)BQ,SQ(2)MD,TT(4)6
>
COMMENT/
A LONG VECTOR WORD (LVW) FOR THE III DISPLAY HAS THE FOLLOWING FORMAT
BITS 0-10 X COORDINATE
BITS 11-21 Y COORDINATE
BITS 22-24 BRT BRIGHTNESS. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
BITS 25-27 SIZ SIZE. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
BIT 29 M MODE. 0=RELATIVE TO LAST, 1=ABSOLUTE FROM CENTER
BITS 30-31 T TYPE. 0=VISIBLE, 1=ENDPOINT, 2=INVISIBLE
BITS 32-35 6. DENOTES LVW IN DISPLAY PROCESSOR
/
EXTERN JOBFF,JOBREL
SWTICK←←6 ;NUMBER OF TICKS BETWEEN ACTIVATIONS.
SWPSEC←←74/SWTICK ;NUMBER OF ACTIVATIONS PER SECOND.
SUBTTL STORAGE OF SORTS
PDLEN←←40
PDLIST: BLOCK PDLEN
SPDLEN←←40
SPWPDL: BLOCK SPDLEN ;PDL FOR SPACEWAR.
PATCH: BLOCK 20
PATCH1: BLOCK 20
PATCH2: BLOCK 20
WCMA: BLOCK 3
JOBN←←100
XJOB: 0 ;CURRENT JOB
XFIT: 0
XFORCE: 0
XSHFWA: 0
XQUEUE: BLOCK JOBN ;JOBQUE
XNAME: BLOCK JOBN ;JOBNAM
XPPN: BLOCK JOBN ;PRJPRG
XADR: BLOCK JOBN ;JBTADR
XCORTB: BLOCK 100 ;CORTAB
XLINE: BLOCK JOBN ;JBTLIN
XSTS: BLOCK JOBN ;JBTSTS
XSWP: BLOCK JOBN ;JBTSWP
XTIME: BLOCK JOBN ;TTIME
XSWPG: BLOCK JOBN ;SPWGO
XSWPG2: BLOCK JOBN ;SP2GO
XJBST2: BLOCK JOBN ;JBTST2
MAPTXT: BLOCK JOBN*4 ;KEEP TEXT FOR THE MAP HERE!
MPHILO: BLOCK 106 ;KEEP HI/LO LOCATION OF JOB HERE
MPYLOC: BLOCK 106 ;KEEP Y POSITION OF BOUND LINE/DATA LINE
MAPPPN: BLOCK JOBN ;KEEP PPN FOR MAP HERE
MAPNAM: BLOCK JOBN ;KEEP JOBNAME FOR MAP HERE
XQNAM: BLOCK 20 ;QUEUE NAMES
SYMMAX←←1000 ;MAXIMUM NUMBER OF SYMBOLS.
INSYM: BLOCK SYMMAX ;SIXBIT TABLE OF INTERNALIZED SYMBOLS
INVAL: BLOCK SYMMAX ;INTERNAL TABLE OF SYMBOLS&VALUES
INSCNT: 0 ;COUNT OF ACTUAL INTERNALIZED SYMBOLS.
SPWACT: 0 ;SET TO -1 ONCE SPACEWAR STARTS
SPWSUS: 0 ;SET TO -1 TO MAKE SPACEWAR DISMISS QUICK
SPWACK: 0 ;SET BY SPACEWAR TO ACKNOWLEDGE A SUSPESION REQUEST
UPTIM: 0 ;SAVE UPTIME HERE.
TCNT: 0
TBYP: 0
TWORD: 0
DIGCNT: 0
DEBUG: 0 ;SET ≠0 FOR NO SPACEWAR
STHERE: 0 ;SET TO -1 WHEN ATTACHED TO SYMBOLS.
ZERO: 0 ;A CELL CONTAINING ZERO
PROREL: 0 ;SET TO LAST VALUE OF SETPR2
XCONFI: BLOCK 20 ;ASCIZ TEXT COPIED FROM SYSTEM.
UPTXT: 0 ;UPTIME TEXT
SYSREL: 0
CLOCK: 0 ;BYTE POINTER TO MAKE CLOCK REQUESTS.
CLKTAB: BLOCK 200 ;TABLE FOR CLOCK REQUESTS.
DPTR0: 0 ;POINTER/COUNTER FOR BUFFER0
DPTR1: 0
DPTR2: 0
DPTR3: 0
DPTR4: 0
DPTR5: 0
DPBLN0←←40
DPBLN1←←40
DPBLN2←←400
DPBLN3←←400
DPBLN4←←2000
DPBLN5←←20
DPYBF0: BLOCK DPBLN0
DPYBF1: BLOCK DPBLN1
DPYBF2: BLOCK DPBLN2
DPYBF3: BLOCK DPBLN3
DPYBF4: BLOCK DPBLN4
DPYBF5: BLOCK DPBLN5
DPYHD0: BLOCK 2
DPYHD1: BLOCK 2
DPYHD2: BLOCK 2
DPYHD3: BLOCK 2
DPYHD4: BLOCK 2
DPYHD5: BLOCK 2
SSYMS: ;LIST OF VALUES OF SYMBOLS OF SPECIAL INTEREST.
AQNAMS: 0
AJOBNA: 0
AJTSTS: 0
APRJPR: 0
AJBST2: 0
AJBTQ: 0
AJQUE: 0
AJOB: 0
ACORTA: 0
AJLIN: 0
AJADR: 0
AJSWP: 0
ATTIME: 0
ASPWGO: 0
ASP2GO: 0
AUPTI: 0
ACONFI: 0
ATIME: 0
ATDATE: 0
AFORCE: 0
AFIT: 0
ASHFWA: 0
VMXQUE: 0
SSYMND←←.-1
MAPON: 0 ;SET TO -1 WHILE MAP IS ACTIVE
MAPOFF: 0 ;SET TO -1 TO KILL MAP.
THSJOB: 0
HILOC: 0
LOLOC: 0
CORSIZ: 0 ;SET TO NUMBER OF 1K BLOCKS OF CORE.
THJDR: 0
UFL: 0 ;SET TO -1 WHEN UNDEFINED SYMBOL IS USED
WHATFL: 0 ;SET TO -1 FOR UNKNOWN COMMAND
XON: 0 ;SET TO -1 DURING X COMMAND
ACTIVE: 0
TCODE: 0
TNAME: 0
QLN←←200 ;SIZE OF QUEUE SPACE.
QSPACE: BLOCK QLN ;SPACE TO PUT QBLOCKS.
QPTR: 0 ;AMOUNT OF SPACE USED IN QUEUE.
TBLON: 0 ;SET TO -1 WHILE DISPLAYING TABLES, ETC.
NJACT: 0
FILCHR: 0 ;FILL CHARACTER FOR DECIMAL PRINTER.
LASTHI: 0 ;HIGHEST ADDRESS IN USE BY USERS
BODNOW: 0 ;SET TO -1 WHEN WE MOVE THE LITTLE MAN.
DPZERO: DPZERO+1 ;USED FOR KILLING A PIECE OF GLASS
0
BLOCK 2 ;MAKE SURE THAT NOTHING HAPPENS
MANLOC: 0
HOLSEN: 0
NJT←←10 ;NUMBER OF TABLES TO REMEMBER DISPLAY DATA
JTAB: BLOCK NJT*JOBN ;SAVE JOB DATA HERE.
WPJ←←20 ;NUMBER OF WORDS TO USE FOR EACH JOB LINE.
LTEXT: BLOCK 20*JOBN ;SOME WORDS FOR EACH JOB. TO DISPLAY LINES.
SUBTTL ERROR MESSAGES.
NOCORE: OUTSTR [ASCIZ/CORE UUO FAILURE.
/]
JRST ESTOP
NOSYM: OUTSTR [ASCIZ/NO SYMBOLS CAN BE FOUND ANYWHERE.
/]
JRST ESTOP
FBERR: OUTSTR [ASCIZ/FAST BAND READ ERROR.
/]
JRST ESTOP
NOREMA: OUTSTR [ASCIZ/REMAP FAILURE.
/]
JRST ESTOP
NOSETP: OUTSTR [ASCIZ/SETPR2 UUO FAILURE.
/]
JRST ESTOP
NOLINK: OUTSTR [ASCIZ/LINKUP FAILURE.
/]
JRST ESTOP
ESTOP: HALT
SUBTTL HERE WE LOCATE THE SYSTEM SYMBOL TABLE
GETSYM: MOVEI A,36 ;HERE'S WHERE THEY GOTTA BE.
PEEK A,
JUMPE A,SYMDSK ;JUMP IF SYMBOLS ARE ON THE DISK.
HLRE B,A ;THIS IS THE SIZE OF THE SYMBOL TABLE.
MOVN B,B ;MAKE IT POSITIVE.
MOVE D,B ;REMEMBER SIZE OF SYMBOLS
ADD B,JOBREL ;THIS IS HOW MUCH CORE WE NEED.
MOVEI W,1(B) ;SAVE END ADDRESS FOR BLT IN W.
HRRZ C,JOBREL ;GET THE DESTINATION-1 OF BLT
ADDI C,2 ;DESTINATION (2ND WORD IN NEXT K)
HRLI C,400000(A) ;SOURCE IN THE UPPER.
CORE B, ;ASK FOR CORE.
JRST NOCORE ;CAN'T HAVE ANY. LOSE.
MOVEM D,-1(C) ;SAVE SYMBOL TABLE SIZE IN FIRST WORD.
MOVEI D,-2(C) ;REMEMBER BREAK POINT FOR REMAP.
MOVEI B,37 ;LOOK FOR SYSTEM JOBREL
PEEK B,
CAILE B,377777 ;MORE THAN 128K OF CORE?
MOVEI B,377777 ;YES. REDUCE FOR SETPR2
TRZ B,1777
MOVSI B,1(B) ;WE WANT TO SPY INTO THE LOW HALF OF CORE.
SETPR2 B, ;TELL SYSTEM.
JRST NOSETP ;CAN'T DO THIS?
BLT C,(W) ;MOVE SYMBOL TABLE INTO CORE.
REMAP D, ;MAKE UPPER SEGMENT HAPPEN.
JRST NOREMA ;REMAP FAILURE.
POPJ P, ;RETURN WITH HAPPINESS.
SUBTTL THERE ARE NO SYMBOLS IN SYSTEM CORE - READ SWAPPING DISK.
SYMDSK: MOVE B,JOBFF
MOVEI A,42(B) ;GET SOME ROOM FOR ONE SECTOR.
CORE A,
JRST NOCORE
MOVEI A,400100 ;ABSOLUTE OPERATION ON SYSTEM BAND
MOVEM B,WCMA ;ADDRESS TO PUT DATA
MOVEI C,40 ;WORD COUNT
MOVEM C,WCMA+1 ;SAVE IT.
SETZM WCMA+2 ;SECTOR ZERO (WORDS 0-37)
FBREAD A,WCMA ;READ SWAPPING DISK.
JRST FBERR ;CAN'T WIN THIS WAY.
SKIPN C,36(B) ;PICKUP IMAGE OF SYSTEM LOCATION 36.
JRST NOSYM ;NO SYMBOLS ON THE SWAPPING DISK TOO.
MOVEI D,(C) ;SYSTEM'S SYMBOLS ADDRESS
LSH D,-5 ;DIVIDE TO MAKE A SECTOR NUMBER.
MOVEM D,WCMA+2 ;SAVE SECTOR NUMBER.
HLRE D,C ;GET -WD COUNT OF SYMBOL TABLE.
MOVN D,D
MOVE X,D ;SAVE SIZE HERE.
ADDI D,40 ;MAKE SURE WE READ ENOUGH.
MOVEM D,WCMA+1 ;SAVE WORD COUNT.
MOVE W,JOBREL ;REMEMBER THIS FOR REMAP LATER.
ADDI D,2(W) ;READ INTO SECOND WORD ABOVE OUR TOP.
CORE D, ;
JRST NOCORE ;CANT HAVE MORE CORE.
HLRE D,C ;GET THE WORD COUNT AGAIN
MOVNM D,1(W) ;SAVE IN FIRST WORD OF CORE IMAGE
MOVEI D,2(W) ;STARTING ADDRESS OF TRANSFER.
MOVEM D,WCMA ;SAVE IT.
FBREAD A,WCMA ;READ LIBRASCOPE.
JRST FBERR ;LOSE.
ANDI C,37 ;THIS IS THE SYMBOL TABLE OFFSET.
JUMPE C,DSYM1 ;NO OFFSET. WHAT A WIN.
ADDI C,2(W) ;THIS IS WHERE DATA STARTS
MOVS C,C
HRRI C,2(W) ;LOAD DESTINATION.
ADDI X,2(W) ;GET THE END OF THE BLT.
BLT C,(X) ;BLT THE SYMBOLS DOWN.
DSYM1: MOVE A,W ;GET THE ADDRESS FOR REMAP.
REMAP A,
JRST NOREMA ;LOSE.
POPJ P, ;RETURN.
SUBTTL SYMBOL TABLE STUFF
GETDEF: SKIPN SPWACT ;SKIP IF SPACEWAR IS IN PROGRESS.
JRST GETDF1 ;NO SPACEWAR TO LOSE.
SETOM SPWSUS ;SET SUSPENSION REQUEST.
GETDF0: SKIPE SPWACK ;SKIP IF NOT ACKNOWLEGE YET
JRST GETDFX ;OK. SPACEWAR IS DONE AND GONE.
MOVEI B,0
SLEEP B,
JRST GETDF0 ;LOOP.
GETDFX: PUSHJ P,GETDF1 ;CALL FOR SYMBOL
SOS (P) ;SO WE'LL NOT SKIP RETURN BY CPOPJ1
PUSH P,A
PUSHJ P,ATTOLD ;REATTACH WHATEVER WAS ATTACHED BEFORE.
POP P,A ;SAVE A OVER CALL ON ATTOLD!
SETZM SPWSUS ;RELEASE SPACEWAR SUSPENSION.
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
GETDF1: PUSHJ P,SEGATT ;ATTACH TO SEGMENT, IF NOT ALREADY ATTACHED.
PUSHJ P,X6TO5 ;SIXBIT ARG IN A. RADIX 50 BACK IN B.
MOVE C,400000 ;GET THE SYMBOL TABLE LENGTH
ADDI C,377777 ;LOCATION OF LAST SYMBOL IN CORE.
GETDF2: MOVE D,(C) ;GET SYMBOL IN RADIX50
TLZ D,740000 ;AND OUT HIGH 4 BITS.
CAMN D,B ;COMPARE.
JRST GETDF3 ;SAME. WIN.
SUBI C,2
CAILE C,400000
JRST GETDF2
POPJ P, ;CAN'T FIND SYMBOL
GETDF3: MOVE B,1(C)
JRST CPOPJ1 ;RETURN A WINNER.
X6TO5: SETZB B,C ;SIXBIT IN A, RADIX50 COMES BACK IN B.
MOVE D,A ;GET THE SIXBIT.
X6TO5A: JUMPE D,CPOPJ ;IF ALL DONE, RETURN
LSHC C,6 ;MOVE ONE LETTER TO C.
JUMPE C,X6TO5E ;BLANK?
CAIL C,'0'
CAILE C,'9'
JRST X6TO5B ;NOT A DIGIT
SUBI C,'0'-1 ;MAP '0' ← 1 '9' ← 12
JRST X6TO5E
X6TO5B: CAIL C,'A'
CAILE C,'Z'
JRST X6TO5C
SUBI C,'A'-13 ;'A' ← 13
JRST X6TO5E
X6TO5C: ADDI C,42
CAIN C,"."+2
MOVEI C,45 ;HACK FOR DOT, PERCENT AND DOLLAR.
X6TO5E: IMULI B,50
ADD B,C
SETZ C,
JRST X6TO5A ;LOOP.
;ROUTINE TO LOOK FOR SYMBOL IN INTERNAL TABLE ONLY.
XDEF: MOVE C,INSCNT ;GET COUNT OF INTERNALIZED SYMBOLS.
JUMPE C,CPOPJ ;NONE INTERNAL: LOSE.
CAME A,INSYM-1(C) ;LOOK FOR ONE
SOJG C,.-1
JUMPLE C,CPOPJ ;LOSE. CAN'T FIND IT INSIDE
MOVE B,INVAL-1(C) ;WIN. GOT IT.
JRST CPOPJ1 ;RETURN IT
; SUBROUTINE TO LOOK FOR SYMBOL IN INTERNAL TABLE, IF FAILURE, LOOK IN UPPER.
DEF: PUSHJ P,XDEF ;LOOK INSIDE FOR IT
JRST DEF3 ;NOT INSIDE
JRST CPOPJ1 ;SUCCESS.
DEF3: PUSHJ P,GETDEF ;GET THE DEFINITION FROM THE UPPER.
POPJ P, ;THERE IS NO SUCH BEAST.
AOS C,INSCNT ;COUNT A SYMBOL FOUND
CAILE C,SYMMAX ;SKIP IF OK
JRST DEF4 ;SYMBOL TABLE OVERFLOW
MOVEM A,INSYM-1(C) ;SAVE IT INTERNALLY.
MOVEM B,INVAL-1(C) ;SAVE VALUE
JRST CPOPJ1 ;RETURN HAPPY.
DEF4: OUTSTR [ASCIZ/INTERNAL SYMBOL TABLE OVERFLOW!
/]
SOS INSCNT ;CORRECT THE COUNT.
JRST CPOPJ1 ;RETURN CORRECT VALUE IN B.
SUBTTL SEGMENT MANAGER
COMMENT $
THIS CODE IS USED WHEN SOMEONE DECIDES HE WANTS TO USE
A PARTICULAR UPPER, EITHER THE SYMBOL SEGMENT OR
PHYSICAL CORE, CAN BE SELECTED. IF THE SEGMENT SELECTED
IS NOT THE SAME AS THE SEGMENT THAT WAS IN USE, THE SEGMENTS
ARE SWITCHED.
THE SPACEWAR MODULE USES SETPR2 EXCLUSIVLY. THE USER MODE
PORTION CAN DO WHATEVER IT WANTS.
SEGATT ATTACH SYMBOLS.
SYSATT ATTACH SYSTEM. SET A TO THE APPROPRIATE VALUE.
LAST VALUE OF SETPR2 IS REMEMBERED AS PROREL
ATTOLD USES PROREL TO DO THE SETPR2.
$
SEGATT: SKIPE STHERE ;IS SEGMENT THERE ALREADY?
POPJ P, ;YES. RETURN QUICK
SETOM STHERE ;ANNOUNCE WE HAVE A SEGMENT.
LINKUP ;TRY TO LINKUP
JRST NOLINK ;LINKUP FAILURE.
POPJ P, ;RETURN
ATTOLD: MOVE A,PROREL ;GET OLD VALUE.
SYSATT: SKIPN STHERE ;IS THERE A SEGMENT NOW?
CAME A,PROREL ;NO SEG. IS THIS SAME AS BEFORE?
CAIA ;NEED TO DO SETPR2
POPJ P, ;DON'T NEED TO DO IT.
SKIPE STHERE
DETSEG ;DETACH THE SEGMENT.
SETZM STHERE ;NO SEGMENT THERE.
PUSH P,A
SETPR2 A,
JRST SYSAT1
POP P,PROREL
POPJ P,
SYSAT1: POP P,A
JRST NOSETP
SUBTTL UNDEF - ERROR MESSAGE FOR UNDEFINED SYMBOLS.
UNDEF: PUSH P,A
PUSHJ P,TYSIX
POP P,A
OUTSTR [ASCIZ/ UNDEFINED
/]
JRST CPOPJ1 ;AND SKIP RETURN
TYSIX: MOVE B,A
TYSIX1: SETZ A,
JUMPE B,CPOPJ
LSHC A,6
ADDI A," "
TTCALL 1,A
JRST TYSIX1
SUBTTL BEGIN HERE
BEGIN: RESET
MOVE P,[IOWD PDLEN,PDLIST]
PUSHJ P,GETSYM ;GO GET THE SYSTEM SYMBOLS.
SETOM STHERE ;WE MUST NOW HAVE A SEGMENT.
DEFINE MAKDEF(QQ,RR)
< MOVE A,['QQ']
PUSHJ P,DEF
PUSHJ P,UNDEF ;THIS GUY WILL ALWAYS SKIP RETURN
MOVEM B,RR
>
MOVE A,[SSYMS,,SSYMS+1]
SETZM SSYMS
BLT A,SSYMND ;ZERO OUR SPECIAL CELLS.
MAKDEF JOBNAM,AJOBNA
MAKDEF JBTSTS,AJTSTS
MAKDEF PRJPRG,APRJPR
MAKDEF JBTQ,AJBTQ
MAKDEF JOBQUE,AJQUE
MAKDEF CORTAB,ACORTA
MAKDEF JBTLIN,AJLIN
MAKDEF JBTADR,AJADR
MAKDEF JBTSWP,AJSWP
MAKDEF TTIME,ATTIME
MAKDEF SPWGO,ASPWGO
MAKDEF SP2GO,ASP2GO
MAKDEF JOB,AJOB
MAKDEF FORCE,AFORCE
MAKDEF FIT,AFIT
MAKDEF SHFWAT,ASHFWA
MAKDEF UPTIME,AUPTI
MAKDEF CONFIG,ACONFI
MAKDEF TIME,ATIME
MAKDEF MXQUE,VMXQUE
MAKDEF QNAMS,AQNAMS
MAKDEF THSDAT,ATDATE
MAKDEF JBTST2,AJBST2
DPYCLR ;CLEAR THE DISPLAY
DPYSIZ 2001 ;1 LINE/GLITCH, 4 GLITCHES/SCREEN
DPYPOS -740 ;PUSH PIECE OF PAPER TO BOTTOM OF SCREEN.
MOVEI A,37 ;LOOK FOR SYSTEM JOBREL
PEEK A,
MOVEM A,SYSREL ;LARGEST ADDRESS IN SYSTEM
MOVE B,A
ADDI B,1
LSH B,-12
MOVEM B,CORSIZ
CAILE A,377777 ;128K OR LESS?
MOVEI A,377777 ;NO REDUCE TO 128
TRZ A,1776 ;MASK IRRELEVENT BITS
MOVSI A,(A) ;THIS IS PROTECTION. ZERO RELOCATION
PUSHJ P,SYSATT ;ATTACH TO THE SYSTEM
HRLZ A,AQNAMS
TLO A,400000 ;MAKE ADDRESS IN UPPER.
HRRI A,XQNAM ;PLACE TO STORE.
MOVE B,VMXQUE ;GET THE NUMBER OF QUEUES
CAILE B,20
MOVEI B,20
BLT A,XQNAM(B) ;LOAD THE DATA.
MOVE A,[POINT 36,CLKTAB-1,35];MAKE BYTE POINTER FOR CLOCK REQUESTS
MOVEM A,CLOCK ;SAVE BYTE POINTER.
MOVE A,[RCONFI,,1] ;DO THE CONFIG STUFF
IDPB A,CLOCK
SETZM MAPON ;MAKE SURE WE DON'T THINK WE'RE MAPPING
PUSHJ P,SPWINI ;INITIALIZE SPACEWAR JOB
CMAIN: PUSHJ P,MAIN ;CALL THE TTY MAIN LOOP
MOVEI A,1
SLEEP A,
JRST CMAIN ;LOOP.
SUBTTL MAIN COMMAND SCANNER.
MAIN: TTCALL 5,A ;HAS A LINE BEEN ACTIVATED
POPJ P, ;NO. RETURN AND DO NOTHING
SETZM WHATFL
SETZM UFL
PUSHJ P,GETSXX ;COLLECT SIXBIT TEXT
JRST WHACOM ;ERROR UNRECOGNIZED SIXBIT
MOVEM A,ACTIVE ;SAVE ACTIVATOR CODE.
JUMPE B,MAIN1 ;JUMP IF NO TEXT SEEN BEFORE ACTIVATOR
MOVE A,B ;GET THE SIXBIT TEXT,
MOVEM A,TNAME ;SAVE SIXBIT NAME FOR LATER.
PUSHJ P,DEF ;LOOK FOR A DEFINITION.
JRST UCOM ;UNDEFINED. PUT UP TEXT.
MAIN1: MOVEM B,TCODE ;SAVE TABLE CODE.
MOVE A,ACTIVE ;GET THE ACTIVATOR
ANDI A,177 ;STRIP OFF THE BUCKY BITS
CAIL A,"a"
CAILE A,"z"
CAIA
SUBI A," " ;TURN LOWERCASE INTO UPPER.
MOVSI B,-ATABLN ;GET THE TABLE LENGTH
HLRZ C,ATAB(B) ;GET A CHARACTER FROM TABLE.
CAME A,C ;SAME?
AOBJN B,.-2 ;LOOP
JUMPGE B,WHACOM ;DON'T UNDERSTAND
HRRZ B,ATAB(B) ;GET THE COMMAND DISPATCH
JRST (B) ;AND DISPATCH. COMMAND RETURNS WITH POPJ.
ATAB: "X",,XCOM ;XTEND COMMAND
12,CPOPJ ;NULL COMMAND
"6",,SIXCOM ;DISPLAY IN SIXBIT
"T",,TEXCOM ;TEXT OUTPUT
";",,CELCOM ;DISPLAY ONE CELL ONLY
"/",,CELCOM ;DISPLAY INDIVIDUAL CELL
"U",,OHCOM ;DISPLAY OCTAL HALF WORDS
"D",,DECOM ;DISPLAY DECIMAL
"K",,KILCOM ;KILL A DISPLAY
"O",,R8COM ;RADIX 8
ATABLN←←.-ATAB
CELCOM: POPJ P, ;FOR NOW.
KILCOM: MOVN B,QPTR
JUMPE B,CPOPJ
HRLZ B,B
KILCM1: MOVE A,QSPACE(B)
CAMN A,TNAME
JRST KILCM2
ADD B,[3,,3]
JUMPL B,KILCM1
JRST WHACOM
KILCM2: MOVNI C,3
ADDB C,QPTR
MOVE A,QSPACE(C)
MOVEM A,QSPACE(B)
MOVE A,QSPACE+1(C)
MOVEM A,QSPACE+1(B)
MOVE A,QSPACE+2(C)
MOVEM A,QSPACE+2(B)
POPJ P,
R8COM: MOVEI C,DOCT
JRST COMCON
SIXCOM: MOVEI C,DSIXB
JRST COMCON
TEXCOM: MOVEI C,TEXTO ;TO DO TEXT
JRST COMCON
OHCOM: MOVEI C,DOCTH ;TO DO OCTAL HALF WORDS
JRST COMCON
DECOM: MOVEI C,DECOUT
JRST COMCON
COMCON: MOVE B,QPTR ;GET THE QUEUE POINTER.
CAILE B,QLN-20 ;HAVE WE GOT ENOUGH SPACE?
JRST COMCNE ;NO. ERROR.
MOVE A,TNAME ;GET THE SIXBIT NAME
MOVEM A,QSPACE(B) ;SAVE IT.
CAMN A,['JOBQUE'] ;IS THIS SPECIAL?
MOVEI C,QDISP ;YES. USE SPECIAL OUTPUT
HRRZ A,TCODE ;GET THE CODE.
JUMPE A,WHACOM ;ERROR
TRO A,400000 ;MAKE AN ADDRESS IN THE UPPER.
HRLI A,W ;MAKE AN INDEX FIELD FOR W.
MOVEM A,QSPACE+1(B) ;SAVE. IN QUEUE.
MOVEM C,QSPACE+2(B) ;SAVE THE OUTPUT DRIVER NAME.
ADDI B,3
MOVEM B,QPTR
MOVE A,[DPYTAB,,1]
SKIPN TBLON
IDPB A,CLOCK
SETOM TBLON
POPJ P,
COMCNE: TTCALL 3,[ASCIZ/INTERNAL QUEUE SPACE EXCEEDED.
/]
POPJ P,
WHACOM: SETOM WHATFL
JRST CFLUSH
UCOM: SETOM UFL
CFLUSH: TTCALL 11, ;FLUSH HIS TYPE AHEAD
SETZM XON
POPJ P,
XCOM: SETOM XON ;SAY WERE IN X COMMAND MODE
PUSHJ P,GETSIX ;GET SIXBIT
JRST WHACOM
SETZM XON ;
MOVSI A,-XCTB
CAME B,XCTAB(A)
AOBJN A,.-1
JUMPGE A,WHACOM
JRST @XCTAB2(A) ;DISPATCH TO SERVICE.
XCTAB: 'MAP'
'XMAP'
'EXIT'
'KILL'
XCTB←←.-XCTAB
XCTAB2: MAPGO
MAPKIL
DIENOW
KILQ
DIENOW: SPCWAR 'SSW'
DPYCLR ;FLUSH THE DISPLAY
EXIT ;AND EXIT
KILQ: SETZM QPTR
JRST MAPKIL
SUBTTL GETSIX
GETSXX: SETZ B,
JRST GETSX2 ;FALL INTO REST OF GETSIX
GETSIX: SETZ B,
GETSX1: TTCALL 4,A ;GET A CHARACTER
GETSX2: CAILE A,177 ;IS THIS A CONTROL CHARACTER
JRST CPOPJ1 ;YES. RETURN QUICK.
CAIE A," "
CAIN A,15
JRST GETSX1 ;FLUSH CR AND BLANK
CAIE A,11 ;TAB AND LF ARE DELIMITERS.
CAIN A,12
JRST CPOPJ1 ;RETURN THEM.
CAIE A,"/"
CAIN A,";"
JRST CPOPJ1 ;/ AND ; ARE DELIMS.
CAIG A," " ;MUST BE BIGGER THAN A BLANK
POPJ P, ;ERROR FROM GETSIX
CAIL A,"a"
CAILE A,"z"
CAIA
SUBI A," " ;MAKE UPPER CASE
SUBI A," " ;MAKE SIXBIT
CAILE A,77
POPJ P, ;ERROR
TLNE B,770000
JRST GETSX1 ;COLLECT ONLY 6 CHARACTERS.
LSH B,6
IOR B,A
JRST GETSX1 ;LOOP
SUBTTL PUT UP A TITLE LINE.
CONRAT←←=15*SWPSEC ;ACTIVATION RATE.
RCONFI: MOVE SPDL,DPTR0 ;GET THE PDL FOR THIS BUFFER
PUSHJ P,RCON1 ;MAKE MESSAGES
MOVEM SPDL,DPTR0 ;SAVE THE NEW VALUE OF PDL
MOVE A,[RCONFI,,CONRAT] ;REFRESH IN 15 SECONDS
IDPB A,CLOCK ;MAKE A CLOCK REQUEST.
POPJ P,
YHI←←740
YLO←←-710
XHI←←777
XMLO←←540
XLO←←-777
RCON1: PUSH SPDL,[LVW(XLO,YHI,i,a,3)]
PUSH SPDL,[LVW(XHI,YHI,,a,3)]
PUSH SPDL,[LVW(XHI,YLO,,a,3)]
PUSH SPDL,[LVW(XLO,YLO,,a,3)]
PUSH SPDL,[LVW(XLO,YHI,,a,3)]
PUSH SPDL,[LVW(XLO,710,i,a,1,2)] ;MAKE A VECTOR
PUSH SPDL,[ASCID/Monmo/]
PUSH SPDL,[ASCID/n: /]
SKIPN B,ACONFI ;GET ADDRESS OF CONFIG DATA
JRST RCON3 ;LOSE. WE NEVER FOUND ONE
RCON2: MOVE A,400000(B) ;REACH INTO SYSTEM AND GRAB
TRO A,1
PUSH SPDL,A
TRNE A,376 ;WAS LAST BYTE A ZERO?
AOJA B,RCON2 ;NO. LOOP FOR MORE
RCON3: SKIPN B,AUPTI ;NOW DO THE UPTIME
JRST RCON4 ;LOSE
PUSH SPDL,[ASCID/ Upti/]
PUSH SPDL,[ASCID/me: /]
PUSHJ P,DINI
MOVE A,400000(B) ;GET THE UPTIME
MOVEM A,UPTIM
PUSHJ P,HMTIM ;WRITE IT
MOVEI A,";"
PUSHJ P,DCHR
MOVEI A," "
PUSHJ P,DCHR
SKIPN B,ATTIME
JRST RCON4A
MOVE A,400000(B)
IMULI A,=100
IDIV A,UPTIM
PUSHJ P,DECOUT
MOVEI A,"%"
PUSHJ P,DCHR
PUSHJ P,DFIN
PUSH SPDL,[ASCID/Null /]
JRST RCON4
RCON4A: PUSHJ P,DFIN
RCON4: SKIPN B,ATDATE
JRST RCON5
PUSHJ P,DINI
MOVEI A," "
PUSHJ P,DCHR
MOVE A,400000(B)
PUSHJ P,DDATE
PUSHJ P,DFIN
RCON5: SKIPN B,ATIME
POPJ P,
PUSHJ P,DINI
MOVEI A," "
PUSHJ P,DCHR
MOVE A,400000(B)
PUSHJ P,HMTIM
JRST DFIN
SUBTTL SWPINI & SPWMOD SPACEWAR JOB
SPWINI: MOVSI A,SWTICK+400000 ;GET THE DESIRED TICK RATE
HRRI A,SPWMOD
SKIPE DEBUG
JRST SPWMOD
SPCWGO A,
SETOM SPWACT ;ANNOUNCE THAT SPACEWAR LEVEL IS ACTIVE.
POPJ P,
SPWMOD: SKIPN SPWSUS ;IS THERE A SUSPENSION REQUEST?
JRST SPWMD1 ;NO ONE IS REQUESTING SUSPENSION
SETOM SPWACK ;ACKNOWLEDGE SUSPENSION AND HANG
JRST SWEXIT
CELLTB: AJOB,,XJOB
AFORCE,,XFORCE
AFIT,,XFIT
ASHFWA,,XSHFWA
SWCTL←←.-CELLTB
SPWMD1: SETZM SPWACK ;NO SUSPENSION CURRENTLY
MOVSI B,-SWCTL ;GET LENGTH OF CELL TABLE
SWCLOP: HLRZ C,CELLTB(B) ;GET THE ADDRESS
HRRZ D,CELLTB(B) ;GET PLACE TO STUFF IT
SKIPE A,(C) ;ANY ADDRESS?
MOVE A,400000(A) ;GET DATA
MOVEM A,(D) ;STUFF IT
AOBJN B,SWCLOP ;LOOP
DEFINE DPYINI!(QQ)<
MOVE SPDL,[IOWD DPBLN!QQ,DPYBF!QQ]
PUSH SPDL,ZERO
MOVEM SPDL,DPTR!QQ
>
DPYINI 0
DPYINI 1
DPYINI 2
DPYINI 3
DPYINI 4
DPYINI 5
MOVE P,[IOWD SPDLEN,SPWPDL]
PUSHJ P,CLKP
PUSHJ P,WHAT ;MAKE ERROR/OK DISPLAY.
JRST 3,@[.+1] ;LEAVE IOT MODE.
DEFINE DPYFIN!(QQ)<
HLRE B,DPTR!QQ ;GET -INITIAL VALUE+COUNT
ADDI B,DPBLN!QQ ;ADD INITIAL VALUE
MOVEI A,DPYBF!QQ ;GET ADDRESS OF DATA
HRRZM A,DPYHD!QQ ;SAVE ADDRESS OF DATA
HRRZM B,DPYHD!QQ+1 ;SAVE COUNT
CAILE B,1 ;SKIP IF SMALL COUNT
UPGIOT QQ,DPYHD!QQ ;DO THE DISPLAY
>
DPYFIN 0
DPYFIN 1
DPYFIN 2
DPYFIN 3
DPYFIN 4
DPYFIN 5
SKIPN BODNOW
JRST SWEXIT ;ALL DONE WITH SPACEWAR
SETZM BODNOW ;CLEAR FLAG
MOVEI A,BLINK ;NORMAL CASE DISPLAY
SKIPN BODPOS ;SIGNALLING FOR A PURGE?
MOVEI A,DPZERO ;YES: PUT UP A ZERO WORD PROGRAM
UPGIOT 17,(A)
SWEXIT: SKIPN DEBUG
DISMIS ;ANOTHER SPACEWAR TERMINATES OK.
MOVEI A,0
SLEEP A,
PUSHJ P,MAIN ;DO THE MAIN LOOP
JRST SPWMOD ;LOOP
SWERR: MOVEM P,PATCH
MOVEM A,PATCH+1
MOVEM B,PATCH+2
SETOM SPWSUS
DISMIS ;IN CASE
WHAT: MOVE SPDL,DPTR5 ;GET A PIECE OF GLASS TO USE
PUSH SPDL,[LVW(740,740,i,a,4,4)] ;VECTOR OUT.
SKIPN WHATFL
SKIPE UFL
JRST WHAT1
SKIPN XON ;XTEND MODE?
SKIPA A,[ASCID/OK/] ;NORMAL MODE
MOVE A,[ASCID/XTEND/]
JRST WHAT2
WHAT1: MOVE A,[ASCID/U/]
SKIPE WHATFL
MOVE A,[ASCID/??/]
WHAT2: PUSH SPDL,A
MOVEM SPDL,DPTR5
POPJ P,
SUBTTL PROCESS "CLOCK" REQUESTS
CLKP: HRRZ A,CLOCK ;GET THE POINTER VALUE
CLKP1: CAIGE A,CLKTAB ;ANY LEFT?
POPJ P, ;NONE LEFT. RETURN
SOS B,(A) ;DECREMENT THE COUNT
TRNE B,7777 ;ANY TIME LEFT?
SOJA A,CLKP1 ;YES. LOOK AT ANOTHER.
MOVE C,@CLOCK ;GET LAST GUY IN LIST.
MOVEM C,(A) ;SAVE HERE
SOS CLOCK ;MAKE LIST SHORTER.
PUSH P,A ;SAVE CRITICAL VALUE
HLRZ A,B ;GET DISPATCH ADDRESS
LDB B,[POINT 6,B,23] ;LOAD B WITH PARAMETER
PUSHJ P,(A) ;GO OFF AND DO IT!
POP P,A ;RESTORE A
SOJA A,CLKP1 ;LOOP.
SUBTTL DCHR CHARACTER-BY-CHARACTER DISPLAY
DFIN: MOVN A,TCNT ;HERE TO FINISH. GET COUNT OF SPACE
CAIE A,5 ;IF THERE'S 5 LEFT, NOTHING TO DO
PUSH SPDL,TWORD ;HERE WE STUFF THE LAST WORD MADE.
POPJ P, ;RETURN
DCHR: IDPB A,TBYP ;HERE TO STUFF A CHARACTER
AOSGE TCNT ;TEST COUNT. SKIP IF OVERFLOW.
POPJ P, ;COUNT IS STILL OK
PUSH SPDL,TWORD ;ADD WORD TO DISPLAY LIST AND REINITIALIZE
DINI: MOVEI A,1 ;HERE TO INITIALIZE DISPLAY
MOVEM A,TWORD ;MAKE A TEXT WORD
MOVNI A,5 ;CHARACTER COUNT
MOVEM A,TCNT ;SAVE
MOVE A,[POINT 7,TWORD] ;BYTE POINTER
MOVEM A,TBYP ;SAVE
POPJ P, ;RETURN
SUBTTL HMSTIME HOURS-MINUTES-SECONDS TIME.
HMSTIM: IDIVI A,74
IDIVI A,74 ;SECONDS IN B
PUSH P,B
IDIVI A,74 ;MINUTES IN B
PUSH P,B ;
PUSHJ P,DECOUT ;DECIMAL OUT - HOURS
MOVEI A,":"
PUSHJ P,DCHR
POP P,A ;GET MINUTES
MOVEI B,2 ;DIGIT COUNT IN B
PUSHJ P,DECDIG
MOVEI A,":"
PUSHJ P,DCHR
POP P,A
MOVEI B,2
JRST DECDIG
HMTIM: IDIVI A,74*74 ;FLUSH JIFFIES AND SECONDS
IDIVI A,74 ;MINUTES IN B
PUSH P,B ;SAVE MINUTES
PUSHJ P,DECOUT ;DECIMAL OUT - HOURS
MOVEI A,":"
PUSHJ P,DCHR
POP P,A ;GET MINUTES
MOVEI B,2 ;DIGIT COUNT IN B
JRST DECDIG ;WRITE DECIMAL
DECPAD: MOVEM B,DIGCNT ;SAVE CHARACTER COUNT
MOVEI B," " ;GET THE FILL CHARACTER
MOVEM B,FILCHR ;SAVE IT.
JRST DECCOM
DECOUT: MOVEI B,0
DECDIG: MOVEM B,DIGCNT ;SAVE NUMBER OF DIGITS TO DO
MOVEI B,"0"
MOVEM B,FILCHR ;SAVE THE FILL CHARACTER
DECCOM: IDIVI A,12
HRLM B,(P)
SOS DIGCNT
JUMPE A,.+2
PUSHJ P,DECCOM
SKIPG DIGCNT
JRST DECCM1
DECCM0: MOVE A,FILCHR ;GET THE FILL CHARACTER.
PUSHJ P,DCHR
SOSLE DIGCNT
JRST DECCM0
DECCM1: HLRZ A,(P)
ADDI A,"0"
JRST DCHR
SUBTTL DDATE
DDATE: IDIVI A,=31 ;DAYS IN B
PUSH P,A ;SAVE A
MOVEI A,1(B)
PUSHJ P,DECOUT ;TYPE DAYS
POP P,A
IDIVI A,=12 ;MONTHS IN B
PUSH P,A
PUSHJ P,DFIN
PUSH SPDL,MONTAB(B)
PUSHJ P,DINI
POP P,A
ADDI A,100
JRST DECOUT
MONTAB: ASCID /-Jan-/
ASCID /-Feb-/
ASCID /-Mar-/
ASCID /-Apr-/
ASCID /-May-/
ASCID /-Jun-/
ASCID /-Jul-/
ASCID /-Aug-/
ASCID /-Sep-/
ASCID /-Oct-/
ASCID /-Nov-/
ASCID /-Dec-/
SUBTTL DPYTAB
DPTBRT←←SWPSEC/2 ;2 DISPLAYS/SECOND
DPYTAB: SKIPN TBLON
POPJ P, ;FLUSH.
MOVE A,[DPYTAB,,DPTBRT]
IDPB A,CLOCK
MOVE SPDL,DPTR4
PUSHJ P,DPYTB1
MOVEM SPDL,DPTR4
POPJ P,
DPYTB1: SKIPE QPTR ;ANYTHING IN QUEUE?
JRST DPTB1A ;YES. DO IT.
PUSH SPDL,ZERO ;NO. FLUSH DISPLAY
SETZM TBLON ;NO MORE DISPLAY ACTIVE
POPJ P,
DPTB1A: HRLZ A,AJTSTS ;GET ADDRESS OF JBTSTS TABLE
JUMPE A,CPOPJ ;LOSE BIG
TLO A,400000 ;TURN ON HIGH SEGMENT BIT
HRRI A,XSTS ;PLACE TO PUT IT ALL
BLT A,XSTS+JOBN-1
MOVSI A,-JOBN
SETZ B,
JNA←←40000
MOVSI C,JNA
TDNE C,XSTS(A)
ADDI B,1
AOBJN A,.-2
MOVEM B,NJACT ;SAVE NUMBER OF JOBS ACTIVE.
PUSH SPDL,[LVW(-776,YHI-50,i,a,2,2)]
PUSHJ P,DINI
; DO THE LINE AT THE TOP OF THE SCREEN.
SETZ X, ;START AT THE START
MOVSI A,'JOB'
PUSHJ P,DSIXB ;DISPLAY IN SIXBIT
DPYTB2: MOVE A,QSPACE(X) ;GET THE NAME OF THE THING BEING DISPLAYED
PUSHJ P,DSIXB ;WRITE IT AS 6 CHARACTERS
MOVE A,[ASCII/ /] ;PLUS 2 BLANKS.
PUSHJ P,TEXTO
MOVSI B,-SPDIST ;GET THE NUMBER OF SPECIAL DISPATCHES
DPTB2A: HRRZ C,SPDIS(B) ;
CAME C,QSPACE+2(X) ;LOOK FOR A MATCH
AOBJN B,.-2
JUMPGE B,DPTB2B
HLRZ C,SPDIS(B)
PUSHJ P,(C)
DPTB2B: ADDI X,3
CAMGE X,QPTR
JRST DPYTB2 ;LOOP
SETZ Y, ;COUNT THE NUMBER OF LINES DONE.
MOVSI W,-JOBN ;GET LOOP CONTROL SET.
DPYTB3: MOVE A,XSTS(W) ;GET THE JOB STATUS
TLNN A,JNA ;JOB THERE?
JRST DPYTB4 ;NOPE.
PUSHJ P,DFIN
PUSH SPDL,[LVW(-776,0,i,a,2,2)]
ADDI Y,1
MOVN A,Y
IMULI A,YHI-YLO-40
IDIV A,NJACT ;DIVIDE BY NUMBER OF ACTIVE JOBS.
ADDI A,YHI-40
DPB A,[POINT 11,(SPDL),21]
PUSHJ P,DINI
HRRZ A,W ;YES. GET THE JOB NUMBER.
MOVEI B,3 ;REQUIRE 3 CHARACTERS
PUSHJ P,DECPAD ;WRITE IN DECIMAL WITH 3 CHARACTERS.
MOVE A,[ASCII/ /]
PUSHJ P,TEXTO
SETZ X,
DPTB3A: MOVE A,@QSPACE+1(X) ;GET THE DATA FROM SYSTEM.
PUSHJ P,@QSPACE+2(X) ;DISPATCH
MOVE A,[ASCII/ /]
PUSHJ P,TEXTO
ADDI X,3
CAMGE X,QPTR
JRST DPTB3A
DPYTB4: AOBJN W,DPYTB3 ;DO THE NEXT JOB.
POPJ P,
SPDIS: SDOCTH,,DOCTH ;SPECIAL HEADING ROUTINE,,DATA ROUTINE
SPDIST←←.-SPDIS
SDOCTH: MOVE A,[ASCII/ /]
PUSHJ P,TEXTO
MOVE A,[ASCII/ /]
JRST TEXTO
SUBTTL MAP DISPLAY A CORE MAP
MAPRAT←←SWPSEC/3 ;REFRESH 3 TIMES/SEC
MAP: SETZM MAPON ;TEMPORARILY SET NOT MAPPING
MOVE SPDL,DPTR2 ;GET A BUFFER POINTER
PUSHJ P,MAP1
MOVEM SPDL,DPTR2 ;SAVE BUFFER POINTER
MOVE A,[MAP,,MAPRAT] ;1/5 SECOND BETWEEN ACTIVATIONS
SKIPN MAPOFF ;IF THE MAP MUST DIE, KILL IT HERE
IDPB A,CLOCK
POPJ P,
MAPGO: SKIPE MAPON ;DO WE HAVE A MAP IN PROGRESS?
POPJ P, ;YES. DON'T MAKE ANOTHER.
SETZM MAPTXT
MOVE A,[MAPTXT,,MAPTXT+1]
BLT A,MAPNAM+JOBN-1 ;ZERO A BIG PLACE
SETZM BODPOS ;MAKE SURE THE LITTLE MAN GETS STARTED.
SETZM BODNOW ;SET WHEN WE NEED A BODY
MOVE A,[MAP,,1]
SETZM MAPOFF ;FLUSH ANY PRIOR SUSPENSION
IDPB A,CLOCK
POPJ P, ;USER MODE ROUTINE TO START MAP
MAPKIL: SETOM MAPOFF ;SET FLAG
MOVE A,[MKIL2,,3]
IDPB A,CLOCK
POPJ P,
MKIL2: SETZM MAPOFF
POPJ P,
MAP1: SKIPN MAPOFF ;ARE WE KILLING THE MAP NOW?
JRST MAP1A ;NO. DO THE MAP AGAIN.
PUSH SPDL,ZERO ;KILL THE MAP. STUFF A ZERO DOWN THE HOLE
SETZM BODPOS ;ZERO POSITION OF THE BODY.
SETOM BODNOW
POPJ P, ;AND RETURN
MAP1A: SETOM MAPON ;TELL THE WORLD WE ARE STILL MAKING MAPS.
PUSH SPDL,[LVW(XMLO,YHI,i,a)]
PUSH SPDL,[LVW(XMLO,YLO,,a)]
HRLZ A,ACORTA
JUMPE A,CPOPJ
TLO A,400000
HRRI A,XCORTB
BLT A,XCORTB+77
HRLZ A,AJOBNA
JUMPE A,CPOPJ
TLO A,400000
HRRI A,XNAME
BLT A,XNAME+JOBN-1
HRLZ A,APRJPR
JUMPE A,CPOPJ
TLO A,400000
HRRI A,XPPN
BLT A,XPPN+JOBN-1
HRLZ A,AJBST2
JUMPE A,CPOPJ
TLO A,400000
HRRI A,XJBST2
BLT A,XJBST2+JOBN-1
HRLZ A,AJTSTS
JUMPE A,CPOPJ
TLO A,400000
HRRI A,XSTS
BLT A,XSTS+JOBN-1
MOVE W,[POINT 9,XCORTB]
SETZM LOLOC
MOVEI Z,101 ;INITIALLY, WE EXPECT THE SYSTEM
MOVEM Z,THSJOB
SETZB Z,HILOC ;WHERE LAST LINE WAS DRAWN
SETZM HOLSEN ;SET THIS WHEN WE SEE A HOLE
SETZM MANLOC ;SET THIS WHEN YOU LOCATE THE MAN
MAP2: ILDB Y,W ;GET A BYTE
CAMN Y,THSJOB ;ARE WE SAME USER'S AREA?
AOJA Z,MAP2 ;COUNT ANOTHER K INSIDE THIS USER
MOVEM Z,HILOC ;SAVE LAST LOCATION USED
MOVE A,THSJOB ;GET ARGUMENT
MOVEM Y,THSJOB ;AND SAVE NEW ARGUMENT.
JUMPN A,.+2
SETOM HOLSEN ;REMEMBER THAT WE SAW A HOLE.
PUSHJ P,MDRAW ;DRAW A MAP
MOVE Z,HILOC ;THIS LAST GUY'S HIGEST
MOVEM Z,LOLOC ;IS NEXT GUY'S LOWEST
MOVE A,THSJOB
CAIE A,105 ;IS THIS BEGINNING OF FREE STG
AOJA Z,MAP2 ;INCREMENT AND LOOP.
MOVE Z,CORSIZ
MOVEM Z,HILOC
JRST MDRAW ;GO OFF AND DO THE F.S. THING
SUBTTL THE LITTLE MAN INSIDE?
PUTPOS: CAMN B,BODPOS ;DON'T CHANGE IT IF ITS RIGHT ALREADY
POPJ P,
MOVEM B,BODPOS ;TO HIS FEET
GOBODY: SETOM BODNOW ;SET THIS TO MAKE THE BODY START
POPJ P,
BLINK: BDYTAB ;POINTER TO DATA
0,,BUFLEN ;WORD COUNT
BDYTAB: 1 ;NO-OP
XWD BPOS,74 ;WHERE WE WERE LAST TIME.
<BYTE(8)0,0,200>+12
BYTE(11)200,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE
BYTE(11)20,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE
<BYTE(8)0,0,40>+12 ;EDGE OVERFLOW?
XWD BLEAV,20 ;NO
BYTE(11)0,0(3)0,0(2)1,2(4)6 ;RESET TO CENTER
<BYTE(8)240,200,0>+12 ;TOGGLE CTRL BIT. TURN OFF EO
BLEAV: XWD BPOS,64 ;SAVE WHERE WE ARE NOW
BODPOS: BYTE(11)1400,1400(3)0,0(2)1,2(4)6 ;ABSOLUTE POSITION
<BYTE(8)0,0,200>+12 ;CONTROL BIT ON?
BYTE(11)0,20(3)0,0(2)0,2(4)6
XWD .+2,20 ;SKIP SAVED WORD
BPOS: 1
DEFINE FOO(X,Y,III)
{
II←←0
IFIDN {III}{I}{II←2}
BYTE(11)<X-XX>,<Y-YY>(3)0,0(2)0,II(4)6
XX←X
YY←Y
}
XX←0
YY←-64
FOO 777776,000100,I
FOO 777774,000100
FOO 777770,000076
FOO 777764,000072
FOO 777762,000066
FOO 777762,000062
FOO 777764,000056
FOO 777770,000052
FOO 777772,000044
FOO 777770,000040
FOO 777764,000034
FOO 777750,000034
FOO 777742,000040
FOO 777740,000054
FOO 777746,000064
FOO 777750,000064
FOO 777754,000070
FOO 777754,000072
FOO 777752,000072
FOO 777752,000074
FOO 777750,000074
FOO 777750,000076
FOO 777746,000076
FOO 777742,000072
FOO 777742,000070
FOO 777732,000056
FOO 777734,000034
FOO 777744,000026
FOO 777752,000024
FOO 777762,000000
FOO 777750,777750
FOO 777754,777720
FOO 777750,777716
FOO 777742,777716
FOO 777742,777714
FOO 777762,777714
FOO 777762,777722
FOO 777756,777750
FOO 777776,777770
FOO 777776,000100,I
FOO 000000,000100
FOO 000004,000076
FOO 000010,000072
FOO 000012,000066
FOO 000012,000062
FOO 000010,000056
FOO 000004,000052
FOO 000002,000044
FOO 000004,000040
FOO 000010,000034
FOO 000024,000034
FOO 000032,000040
FOO 000034,000054
FOO 000026,000064
FOO 000024,000064
FOO 000020,000070
FOO 000020,000072
FOO 000022,000072
FOO 000022,000074
FOO 000024,000074
FOO 000024,000076
FOO 000026,000076
FOO 000032,000072
FOO 000032,000070
FOO 000042,000056
FOO 000040,000034
FOO 000030,000026
FOO 000022,000024
FOO 000012,000000
FOO 000024,777750
FOO 000020,777720
FOO 000024,777716
FOO 000032,777716
FOO 000032,777714
FOO 000012,777714
FOO 000012,777722
FOO 000016,777750
FOO 777776,777770
FOO 777764,000066,I
FOO 777766,000072
FOO 777772,000076
FOO 777774,000076
FOO 777774,000074,I
FOO 777772,000074
FOO 777770,000072
FOO 777770,000070
FOO 777772,000070,I
FOO 777774,000074
FOO 777776,000076,I
FOO 000000,000076
FOO 000004,000072
FOO 000006,000066
FOO 000002,000070,I
FOO 000002,000072
FOO 000000,000074
FOO 777776,000074
FOO 000000,000070
FOO 777776,000070,I
FOO 777774,000076
FOO 777772,000066,I
FOO 777770,000066
FOO 777766,000064
FOO 777770,000062
FOO 777772,000062
FOO 777774,000064
FOO 777772,000066
FOO 000002,000066,I
FOO 000004,000066
FOO 000006,000064
FOO 000004,000062
FOO 000002,000062
FOO 000000,000064
FOO 000002,000066
FOO 777776,000062,I
FOO 777774,000060
FOO 000000,000060
FOO 777776,000062
FOO 777770,000056,I
FOO 777774,000054
FOO 000000,000054
FOO 000004,000056
FOO 777762,000026,I
FOO 000014,000026
FOO 000004,000006
FOO 777770,000006
FOO 777762,000026
FOO 777762,000002,I
BYTE(11)0,0(3)0,1(2)0,2(4)6
ASCID/S/
0
BUFLEN←←.-BLINK-2
SUBTTL MDRAW DRAW THE MAP
COMMENT $
THIS ROUTINE WILL DRAW A LINE ON THE MAP TO DELIMIT THIS
AREA OF CORE, AND PUT UP A LEGEND IN THE RESULTING BOX.
PARAMETERS ARE:
A JOB NUMBER
0 = HOLE
101 = SYSTEM
105 = FREE STORAGE
HILOC HIGHEST ABSOLUTE ADDRESS IN USE
LOLOC LOWEST ABSOLUTE ADDRESS ON USE
$
MBYP: POINT 11,(SPDL),21 ;POINTER TO SET Y FIELD IN LVW AT END OF BUFFER
MDRAW: MOVEM A,THJDR ;SAVE JOB NUMBER FOR A WHILE.
MOVE B,HILOC ;GET THE LOCATION FOR LINE
HRL B,LOLOC ;GET LOLOC TOO.
CAMN B,MPHILO(A) ;SAME AS BEFORE?
JRST MDRW0 ;YES.
MOVEM B,MPHILO(A) ;NO. SAVE THIS NOW.
MOVE B,HILOC ;GET THE HILOC
IMULI B,YHI-YLO ;TIMES THE RESOLUTION HEIGHT
IDIV B,CORSIZ ;DIVIDE TO MAKE A FRACTION
ADDI B,YLO
HRRM B,MPYLOC(A) ;SAVE IT.
MOVE B,HILOC
ADD B,LOLOC
IMULI B,<YHI-YLO>/2
IDIV B,CORSIZ
ADDI B,YLO-10
HRLM B,MPYLOC(A)
MDRW0: CAIL A,105 ;NO TOP BAR FOR FREE STORAGE
JRST MDRAW0 ;SO SKIP THIS BIT
PUSH SPDL,[LVW(XMLO,0,i,a,2,1)] ;GET THE LVW
HRRZ B,MPYLOC(A) ;GET DATA
DPB B,MBYP ;STUFF IN A NEW Y FIELD
PUSH SPDL,[LVW(XHI,0,,a)]
DPB B,MBYP
JUMPE A,CPOPJ ;ALL DONE IF THERE'S NO JOB
SKIPE HOLSEN ;ARE WE ABOVE A HOLE
SKIPE MANLOC ;HAS MAN BEEN DONE
JRST MDRAW0 ;NO HOLE, OR NOT FIRST ABOVE FIRST HOLE
SETOM MANLOC
ANDI B,3777 ;LOOK AT ONLY 11 BITS, PLEASE.
LSH B,=36-=22
IOR B,[LVW(<<XMLO+XHI>/2>,0,i,a,2,1)] ;GET A POINTER
PUSHJ P,PUTPOS ;MAKE THE LITTLE MAN APPEAR
MDRAW0: HLRZ B,MPYLOC(A) ;GET LOCATION FOR THE TEXT
PUSH SPDL,[LVW(XMLO,0,i,a,2,1)]
DPB B,MBYP
CAIGE A,JOBN ;IS SMALLER THAN A BREADBOX?
JRST MDRAW1 ;SMALL ENOUGH TO BE A JOB.
CAIE A,101 ;IS THIS THE MONITOR?
JRST MDRW01 ;NO
PUSH SPDL,[ASCID/ Mon/]
SKIPE XJOB
POPJ P, ;DONE FOR NOW
PUSH SPDL,[LVW(0,0,i,,7,1)]
PUSH SPDL,[ASCID/ /]
PUSH SPDL,[ASCID/ /]
PUSH SPDL,[ASCID/ /]
PUSH SPDL,[ASCID/ ⊗/]
POPJ P,
MDRW01: CAIE A,105
POPJ P,
PUSH SPDL,[ASCID/ F.S./]
SKIPN B,MANLOC ;HAS THE MAN BEEN LOCATED?
PUSHJ P,PUTPOS ;NO. A ZERO WILL KILL IT
POPJ P,
MDRAW1: MOVE B,THJDR ;GET THE JOB NUMBER
MOVE C,XNAME(B) ;GET NEW NAME
MOVE D,XPPN(B) ;GET NEW PPN
CAMN C,MAPNAM(B) ;SAME AS MAP?
CAME C,MAPPPN(B) ;SAME AS MAP?
JRST MDRAW2 ;DIFFERENT. MUST RECOMPUTE
IMULI B,4 ;MULTIPLY BY THE NUMBER OF WORDS IN TEXT
PUSH SPDL,MAPTXT(B) ;STUFF TEXT
PUSH SPDL,MAPTXT+1(B) ;STUFF TEXT
PUSH SPDL,MAPTXT+2(B) ;STUFF TEXT
PUSH SPDL,MAPTXT+3(B) ;STUFF TEXT
JRST MDRAW3 ;LOOK FOR SPACEWAR AND THIS JOB BEING RUN
MDRAW2: MOVEM C,MAPNAM(B) ;SAVE NEW VALUES OF NAME
MOVEM D,MAPPPN(B) ;AND PPN.
PUSHJ P,DINI
MOVE A,THJDR
MOVEI B,2
PUSHJ P,DECDIG ;WRITE IN DECIMAL AND PAD IT.
MOVE B,THJDR
MOVEI A," "
PUSHJ P,DCHR
MOVEI A," "
PUSHJ P,DCHR ;A SPACE
MOVE A,THJDR
MOVE A,XPPN(A)
PUSHJ P,DSIXB
MOVEI A," "
PUSHJ P,DCHR
MOVE A,THJDR
MOVE A,XNAME(A)
PUSHJ P,DSIXB
PUSHJ P,DFIN
MOVE A,[ASCID/ /] ;PICKUP 5 BLANKS
DPB A,[POINT 22,(SPDL),35] ;STUFF 3 BLANKS AND DISPLAY COMMAND BIT
MOVE A,THJDR ;GET THE JOB NUMBER
IMULI A,4 ;TIMES NUMBER OF WORDS TO STORE AWAY
MOVE B,-3(SPDL)
MOVEM B,MAPTXT(A) ;STUFF
MOVE B,-2(SPDL)
MOVEM B,MAPTXT+1(A)
MOVE B,-1(SPDL)
MOVEM B,MAPTXT+2(A)
MOVE B,(SPDL)
MOVEM B,MAPTXT+3(A) ;SAVE ALL THE TEXT.
MDRAW3: MOVE A,THJDR
SKIPE B,XJBST2(A) ;GET SPACEWAR STATUS
TLNE B,40000 ;CHECK SPW SUSPENSION BIT
JRST MDRAW4 ;GUY IS NOT IN SPW.
MOVEI B,"↔" ;SET SPECIAL FLAG
DPB B,[POINT 7,(SPDL),34]
MDRAW4: MOVE B,XSTS(A)
TRNE B,100000 ;TEST JLOCK BIT IN JBTSTS
PUSH SPDL,[ASCID/LOCK/]
CAME A,XJOB
JRST MDRAW5
PUSH SPDL,[LVW(0,0,i,,7,1)]
PUSH SPDL,[ASCID/ ⊗ /]
MDRAW5: CAMN A,AFORCE
PUSH SPDL,[ASCID/FORCE/]
CAME A,ASHFWA
POPJ P,
PUSH SPDL,[ASCID/SHFWA/]
PUSH SPDL,[ASCID/T/]
POPJ P,
SUBTTL DSIXB SIXBIT OUTPUT ROUTINE
DSIXB: MOVE B,A
PUSH P,C
MOVEI C,6
DSIXB1: SETZ A,
LSHC A,6
ADDI A," "
PUSHJ P,DCHR
SOJG C,DSIXB1
POP P,C
POPJ P,
DOCTH: PUSH P,C
PUSH P,A ;CALL HERE FOR OCTAL HALF WORDS.
HLRZ A,A
MOVEI C,=12 ;WE SHALL PUT OUT 14. CHARACTERS
PUSHJ P,DOCTC ;PRINT OCTAL, NO SMARTS
MOVEI A,","
PUSHJ P,DCHR
MOVEI A,","
PUSHJ P,DCHR
POP P,A
HRRZ A,A
PUSHJ P,DOCTC ;PRINT SECOND VALUE AND RETURN
DOCTH1: SOJL C,DOCTH2
MOVEI A," "
PUSHJ P,DCHR
JRST DOCTH1
DOCTH2: POP P,C
POPJ P,
DOCTC: SETZ B,
LSHC A,-3
ROT B,3
SUBI C,1
HRLM B,(P)
JUMPE A,.+2
PUSHJ P,DOCTC
HLRZ A,(P)
ADDI A,"0"
JRST DCHR
SPOCT: TLC A,-1
TLCE A,-1
JRST DOCT ;DO NORMAL THING
MOVE B,A
MOVEI A,"-"
PUSHJ P,DCHR
MOVN A,B
DOCT: SETZ B, ;CALL HERE FOR NORMAL OCTAL PRINTER.
LSHC A,-3
ROT B,3
JUMPE A,DOCT3
HRLM B,(P)
PUSHJ P,DOCT
HLRZ B,(P)
DOCT3: MOVEI A,"0"(B)
JRST DCHR
TEXT5: MOVE B,A
TRO B,1
JRST TEXTO1
TEXTO: MOVE B,A ;SAVE CHARACTERS IN B.
TRZ B,1 ;MAKE SURE WE HAVE ASCII TEXT.
TEXTO1: JUMPE B,CPOPJ
SETZ A,
LSHC A,7
PUSHJ P,DCHR
CAME B,[400000,,0]
JRST TEXTO1
POPJ P,
QDISP: MOVM A,A ;GET THE POSITIVE QUEUE NUMBER.
CAMLE A,VMXQUE ;BIGGER THAN MAX QUEUE?
JRST DOCT ;DISPLAY IN OCTAL
MOVE A,XQNAM(A)
PUSHJ P,TEXTO ;OUTPUT AS TEXT.
MOVEI A," "
JRST DCHR ;OUTPUT A SIXTH CHARACTER.
END BEGIN